iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 10
0
Software Development

30 天介紹 Java 的 Thread系列 第 10

Day 10 介紹 LinkedBlockingQueue 類別 (一)

  • 分享至 

  • xImage
  •  

Queue 的資料結構是先進先出,例如依序把 message1、message2、message3 放入到 Queue 時,讀取出來的順序也會從 message1、message2、message3 按照放入的順序讀取出來。Java 有提供執行緒安全的 Queue 實作,主要有 LinkedBlockingQueue 和 ConcurrentLinkedQueue 它們之間的差別其實可以從 class 的名稱看出來 LinkedBlockingQueue 屬於 Blocking (阻塞) 而 ConcurrentLinkedQueue 則是 NonBlocking (非阻塞),要選擇使用哪一種 Queue 可以依照不同的使用情境來決定。

操作 LinkedBlockinQueue的方式,有把資料加入到 Queue 裡、取出 Queue 的資料內容和檢查 Queue 裡面元素的值,今天就先來介紹如何把資料放入到 Queue 裡。

把資料加入到 Queue,可以呼叫 add、put、offer 三種的方法,每一種的方法都有不同的地方,以下分別用 Sample Code 來介紹:

1.呼叫 add 方法

import java.util.concurrent.LinkedBlockingQueue;

public class AddQueueExample {
    public static void main(String args[]) {
        LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>(2);
        boolean a = queue.add("aaa");
        System.out.println(a);
        boolean b = queue.add("bbb");
        System.out.println(b);
        boolean c = queue.add("ccc");
        System.out.println(c);
    }
} 

以上的程式限制 Queue 只能放入 2 個元素,並且呼叫 add 方法來放入資料的內容,執行結果如下:

true
true
Exception in thread "main" java.lang.IllegalStateException: Queue full
	at java.util.AbstractQueue.add(AbstractQueue.java:98)
	at AddQueueExample.main(AddQueueExample.java:11)

從以上的執行結果可以看到,當資料成功的加入到 Queue 時會回傳 true,如果超出 Queue 的範圍還呼叫 add 方法時,就會收到 Queue 已經滿了的錯誤訊息。

2.呼叫 put 方法

import java.util.concurrent.LinkedBlockingQueue;

public class PutQueueExample {
   public static void main(String args[]) throws Exception {
       LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>(2);
       queue.put("aaa");
       queue.put("bbb");
       queue.put("ccc");
   }
}

使用 put 方法它的傳回值是 void,因此就沒有印出結果。這個程式最主要是當Queue 加入到超出範圍 2 個元素時,程式就會被阻塞住,等待 Queue 有足夠的空間之後才會執行。這個 Sample Code 要實際去執行才比較容易理解。

3.呼叫 offer 方法

import java.util.concurrent.LinkedBlockingQueue;

public class OfferQueueExample {
    public static void main(String args[]) {
        LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>(2);
        boolean a = queue.offer("aaa");
        System.out.println(a);
        boolean b = queue.offer("bbb");
        System.out.println(b);
        boolean c = queue.offer("ccc");
        System.out.println(c);
    }
}

以上的程式是使用呼叫 offer 的方法來把資料加入到 Queue 裡面,執行結果如下:

true
true
false

從以上的結果可以看出使用呼叫 offer 的方式,資料成功放入到 Queue 時會回傳 true,如果 Queue 已經滿了的話就會傳回 false 的狀態。

明天還會繼續介紹如何使用LinkedBlockingQueue 的 class 把資料取出以及檢查元素的部份。


上一篇
Day9 介紹使用 CopyOnWriteArrayList
下一篇
Day 11 介紹 LinkedBlockingQueue 類別 (二)
系列文
30 天介紹 Java 的 Thread30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言